package com.pocketsweet.ui.uilib;

import java.util.LinkedList;

import android.content.Context;
import android.util.AttributeSet;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;

import com.pocketsweet.utils.ToolKits;

public class TagLayout extends LinearLayout {
	/** Layout内边距 */
	private static final int MARGIN_DIMEN = 28;

	/** 标签View集合 */
	public LinkedList<View> container = new LinkedList<View>();

	/** 每一行Layout宽度 */
	private int mWidth = 0;

	private int limitCount = 8;

	private Context ctx;

	public TagLayout(Context context) {
		super(context);

		// 初始化
		init(context);
	}

	public TagLayout(Context context, AttributeSet attrs) {
		super(context, attrs);

		// 初始化
		init(context);
	}

	/**
	 * 初始化
	 * 
	 * @param context
	 */
	private void init(Context context) {
		ctx = context;
		// Layout方向为纵向
		setOrientation(LinearLayout.VERTICAL);

		// 获取WindowManager
		WindowManager manager = (WindowManager) context
				.getSystemService(Context.WINDOW_SERVICE);
		// 获取Display
		Display display = manager.getDefaultDisplay();
		// 设置标签容器宽度
		mWidth = display.getWidth() - dipToPixels(getContext(), MARGIN_DIMEN);
//		refreshLayout();
	}

	public void setLimitCount(int value) {
		this.limitCount = value;
	}

	public LinkedList<View> getTagList() {
		return this.container;
	}

	/**
	 * 添加标签View
	 * 
	 * @param view
	 *            标签View
	 * @param delId
	 *            删除按钮Id
	 */
	public void addView(final View view) {

		if (container.size() == limitCount) {
			ToolKits.toast(ctx, "您已经添加了" + limitCount + "个标签了");
		} else {
			// 添加标签
			container.add(view);
			// 刷新布局
			refreshLayout();
		}
	}

	/**
	 * 移除标签View
	 * 
	 * @param key
	 *            标签标记
	 */
	public void removeView(String key) {
		// 获取标签数量
		int size = container.size();

		// 循环遍历标签
		for (int i = 0; i < size; i++) {
			// 标签标记匹配
			if (((String) container.get(i).getTag()).equals(key)) {
				// 移除该标签
				deleteFromContainer(i);
				// 退出循环
				break;
			}
		}
	}

	/**
	 * 移除标签
	 * 
	 * @param location
	 *            标签位置
	 */
	private void deleteFromContainer(int location) {
		// 标签位置小于0或标签位置大于标签数量
		if (location < 0 || location >= container.size()) {
			// 退出方法
			return;
		}
		// 将View从List中移除
		container.remove(location);

		// 刷新布局
		refreshLayout();

	}

	/**
	 * 刷新布局
	 */
	public void refreshLayout() {

		// 使标签View脱离父布局，否则再次添加会因为标签View已有父布局发生IllegalStateException异常
		for (int i = 0; i < getChildCount(); i++) {
			// 移除所有的标签
			((LinearLayout) getChildAt(i)).removeAllViews();
		}

		// 移除所有的View
		removeAllViews();

		// 获取View的数量
		int len = container.size();

		// 每一行的布局
		LinearLayout row = null;
		// 每一行布局的宽（测量值）
		int w = View.MeasureSpec.makeMeasureSpec(0,
				View.MeasureSpec.UNSPECIFIED);
		// 每一行布局的高（测量值）
		int h = View.MeasureSpec.makeMeasureSpec(0,
				View.MeasureSpec.UNSPECIFIED);
		// 添加标签
		for (int i = 0; i < len; i++) {
			// 首次添加标签
			if (i == 0) {
				// 新建一行
				row = new LinearLayout(getContext());
				// 设置布局的宽高
				row.setLayoutParams(new LinearLayout.LayoutParams(mWidth,
						LayoutParams.WRAP_CONTENT));
				// 方向：横向
				row.setOrientation(LinearLayout.HORIZONTAL);
				// 添加标签
				row.addView(container.get(i));
				// 将标签父布局添加到本布局中
				super.addView(row);
			} else {
				// 计算标签大小
				container.get(i).measure(w, h);
				// 获取计算后的标签宽度
				int width = container.get(i).getMeasuredWidth();
				// 当添加新标签后宽度超出控件容器宽度
				if (getChildItemWidth(row) + width > mWidth) {
					// 新建一行
					row = new LinearLayout(getContext());
					// 设置布局的宽高
					row.setLayoutParams(new LinearLayout.LayoutParams(mWidth,
							LayoutParams.WRAP_CONTENT));
					// 方向：横向
					row.setOrientation(LinearLayout.HORIZONTAL);
					// 添加标签
					row.addView(container.get(i));
					// 将标签父布局添加到本布局中
					super.addView(row);
				} else {
					// 将标签父布局添加到本布局中
					row.addView(container.get(i));
				
				}
			}
		}
	}

	/**
	 * 获取一行标签的宽度
	 * 
	 * @param layout
	 *            标签行
	 * @return 标签行的宽度
	 */
	private int getChildItemWidth(LinearLayout layout) {
		// 标签行的宽度
		int width = 0;
		// 标签数量
		int count = layout.getChildCount();
		// 循环遍历
		for (int i = 0; i < count; i++) {
			// 计算标签总宽度
			width += layout.getChildAt(i).getWidth();
		}
		// 返回标签行的宽度
		return width;
	}
	

	/**
	 * 添加标签Views
	 * 
	 */
	public void addALLView(LinkedList<View> list) {
		container = list;
		// 获取View的数量
		int len = container.size();
		int tempwidth = 0;
		// 每一行的布局
		LinearLayout row = null;
		// 每一行布局的宽（测量值）
		int w = View.MeasureSpec.makeMeasureSpec(0,
				View.MeasureSpec.UNSPECIFIED);
		// 每一行布局的高（测量值）
		int h = View.MeasureSpec.makeMeasureSpec(0,
				View.MeasureSpec.UNSPECIFIED);
		// 添加标签
		for (int i = 0; i < len; i++) {
			// 首次添加标签
			if (i == 0) {
				// 新建一行
				row = new LinearLayout(getContext());
				// 设置布局的宽高
				row.setLayoutParams(new LinearLayout.LayoutParams(mWidth,
						LayoutParams.WRAP_CONTENT));
				// 方向：横向
				row.setOrientation(LinearLayout.HORIZONTAL);
				// 添加标签
				container.get(i).measure(w, h);
				// 获取计算后的标签宽度
				tempwidth = container.get(i).getMeasuredWidth();
				row.addView(container.get(i));
				// 将标签父布局添加到本布局中
				super.addView(row);
			} else {
				// 计算标签大小
				container.get(i).measure(w, h);
				// 获取计算后的标签宽度
				int width = container.get(i).getMeasuredWidth();
				// 当添加新标签后宽度超出控件容器宽度);
				if (tempwidth + width > mWidth) {
					// 新建一行
					tempwidth=width;
					row = new LinearLayout(getContext());
					// 设置布局的宽高
					row.setLayoutParams(new LinearLayout.LayoutParams(mWidth,
							LayoutParams.WRAP_CONTENT));
					// 方向：横向
					row.setOrientation(LinearLayout.HORIZONTAL);
					// 添加标签
					row.addView(container.get(i));
					// 将标签父布局添加到本布局中
					super.addView(row);
				} else {
					tempwidth=tempwidth + width;
					// 将标签父布局添加到本布局中
					row.addView(container.get(i));
				}
			}
		}
	}

	/**
	 * 清除所有标签
	 */
	public void clearAllViews() {
		// 清空List
		container.clear();
		// 移除所有的View
		removeAllViews();
	}

	/**
	 * dip转为像素
	 * 
	 * @param context
	 *            Context
	 * @param dip
	 *            dip
	 * @return 像素
	 */
	private int dipToPixels(Context context, float dip) {
		float scale = context.getResources().getDisplayMetrics().density;
		return (int) (dip * scale + 0.5f);
	}
}
